//
// Created by sjjmw on 3/24/2022.
//
#include "iostream"
#include "vector"
#include "list"
#include "algorithm"
#include "string"
#include "unordered_map"
#include "cmath"
#include<iomanip>
#include "string"
#include "map"
struct Sol{
    std::vector<std::vector<int>> mat;
    int h;
    int w;
    bool layer_ok(int x,int y,int l){
        int x_end=x+l;
        int y_end=y+l;
        if(x_end>=w||y_end>=h){
            return false;
        }
        for(int i=x;i<=x_end;i++){
            if(mat[y_end][i]==0){
                return false;
            }
        }
        for(int i=y;i<=y_end;i++){
            if(mat[i][x_end]==0){
                return false;
            }
        }
        return true;
    }
    bool layer_ok2(int x,int y,int l){
        int x_end=x+l;
        int y_end=y+l;
        if(x_end>=w||y_end>=h){
            return false;
        }
        for(int i=x;i<=x_end;i++){
            if(mat[y_end][i]==1){
                return false;
            }
        }
        for(int i=y;i<=y_end;i++){
            if(mat[i][x_end]==1){
                return false;
            }
        }
        return true;
    }
    void handle(int h1,int w1){
        h=h1;w=w1;
        std::vector<int> line(w);
        bool all_zero= true;
        for(int i=0;i<h;i++){
            for (int j = 0; j < w; ++j) {
                std::cin>>line[j];
                if(line[j]!=0){
                    all_zero= false;
                }
            }
            mat.push_back(line);
        }
//        if(all_zero){
//            printf("0\n");
//            return;
//        }
        ;
        int max_layer=0;
        int max_layer2=0;
        for(int y=0;y<h;y++){
            for(int x=0;x<w;x++){
                auto l=max_layer;
                while (1){
                    if(layer_ok(x,y,l)){
                        l++;
                    }else{
                        max_layer= std::max(max_layer,l-1);
                        break;
                    }
                }
                l=max_layer2;
                while (1){
                    if(layer_ok2(x,y,l)){
                        l++;
                    }else{
                        max_layer2= std::max(max_layer2,l-1);
                        break;
                    }
                }
            }
        }
        max_layer= std::max(max_layer,max_layer2);
        printf("%d\n",(max_layer+1)*(max_layer+1));
    }
};
int main(){
    int a,b,c;
//    std::string str;
    while (std::cin>>a>>b){
        Sol().handle(a,b);
    }
    return 0;
}